import tkinter as tk
from tkinter import font


class CheckTextWidget(tk.Frame):
    def set_check(self, check_var):
        self.check_var.set(check_var)

    def get_txt(self):
        """
        从文本输入框中获取用户输入的文本。

        此方法用于获取用户在界面文本输入框中输入的内容。它不接受任何参数，
        并返回用户输入的字符串。

        返回:
            str: 用户在文本输入框中输入的文本。
        """
        # 通过调用widget_entry对象的get方法来获取输入框中的文本
        return self.widget_entry.get()

    def get_clicked(self):
        """
        获取复选框的状态。

        该方法用于获取绑定在复选框上的变量的当前状态。返回值为布尔类型，
        表示复选框是否被选中。

        返回:
            bool: 复选框的当前选中状态。
        """
        return self.check_var.get()

    def on_widget_check_clicked(self):
        """
        当复选框控件被点击时触发的函数。

        该函数主要用于处理复选框点击事件，默认获取复选框的状态，并获取输入框中的文本内容。
        这两个操作的结果将被打印到控制台，用于调试或显示用户交互的结果。
        用户可以根据需要自定义处理逻辑。

        参数:
        self - 类的实例，包含复选框和输入框等控件的引用。

        返回值:
        无
        """
        print("check_var:", self.get_clicked())
        print("widget_entry_text:", self.get_txt())

    def set_widget_check_clicked(self, command):
        """
        设置控件的点击事件命令。

        本方法用于配置一个控件（widget），当该控件被点击时，将执行指定的命令（command）。
        这种配置常见于按钮（Button）等需要响应用户点击的控件，通过这种方式，可以将控件的点击事件
        关联到特定的函数或方法上，实现相应的功能。

        参数:
        command: 一个可调用对象，当控件被点击时将被执行。这个对象可以是一个函数、方法或其他可调用
                 的对象，它不需要返回值，但可以接受参数。

        返回值:
        无。本方法用于配置控件，不返回任何值。
        """
        self.widget_check.config(command=command)

    def __init__(self, master=None, check_var=False, text="", width=30):
        super().__init__(master)
        # check控件的状态
        self.check_var = tk.BooleanVar(value=check_var)
        # text控件的内容
        self.text = text
        # text控件的宽度
        self.width = width
        # text控件的字体
        self.text_font = font.Font(family="黑体", size=14, weight="bold")

        # 创建一个check控件
        self.widget_check = tk.Checkbutton(
            self, text="", variable=self.check_var, command=self.on_widget_check_clicked)
        # 创建一个Text控件
        self.widget_entry = tk.Entry(self, width=self.width)
        self.widget_entry.insert(0, self.text)
        self.widget_entry.config(font=self.text_font)
        # 使用grid布局管理器来布局控件
        self.widget_check.grid(row=0, column=0, sticky='nsew', padx=0, pady=0)
        self.widget_entry.grid(row=0, column=1, sticky='nsew', padx=0, pady=0)
        # 确保两列具有相同的列权重，以便它们平分可用空间
        self.columnconfigure(0, weight=0)
        self.columnconfigure(0, weight=0)
        # 确保行可以扩展以填充窗口
        self.rowconfigure(0, weight=1)


if __name__ == '__main__':
    # 示例使用
    root = tk.Tk()
    root.title("Custom Checkbutton and Text Widget")
    root.geometry("400x300")

    ctwidget = CheckTextWidget(
        root, check_var=True, text="Hello World!", width=10)
    ctwidget.pack()

    btn = tk.Button(root, text="set False",
                    command=lambda: ctwidget.set_check(False))
    btn.pack()

    btn1 = tk.Button(root, text="set True",
                     command=lambda: ctwidget.set_check(True))
    btn1.pack()

    root.mainloop()
